[SPARC] 19. Delay Slot Optimization 您所在的位置:网站首页 delay slot [SPARC] 19. Delay Slot Optimization

[SPARC] 19. Delay Slot Optimization

2024-07-10 22:52| 来源: 网络整理| 查看: 265

지난 글에서는 Branch Delay Slot 이 발생하는 이유를 파이프라이닝 과정을 따라가보며 살펴보았다.

요약해보면, Branching 여부는 E 단계에서 결정되기 때문에, E 단계에서 분기를 하더라도, E 단계 시점의 F 단계에 있던 명령어가 파이프라인에 남아 계속 실행되는 문제 때문에 이를 비워둠으로써 Delay Slot 이 발생하였다.

 

이번 글에서는 이렇게 Delay Slot 을 비워두지 않고, 다른 명령어로 채워 활용하는 방법.

Delay Slot Optimization 에 대해 정리해보고자 한다.

최적화 개요

그렇다면 어떻게 분기 명령어를 쓴 직후, nop 를 넣지 않고 최적화를 할 수 있을까?

nop 대신 분기에 (전체 코드 실행에) 영향을 주지 않는 다른 명령어를 넣으면 된다.

즉, delay slot 최적화는 프로그램의 실행 결과에 영향을 주지 않으면서 nop 위치를 기존 명령어로 채우는 것을 말한다.

최적화 방법에는 크게 아래와 같은 방법이 있다.

 

From Before

From After

Annulled Branch

 

한번 각각에 대해서 정리해보자.

From Before

From Before 방식은 이름에서 나와있듯, 분기명령어 이전 (before) 의 명령어를 가져와 nop 에 넣는 방식이다.

대표적으로 가능한 방식이, 함수를 호출할 때 call 명령어를 사용하는데, 이 명령어도 delay slot 이 생긴다.

함수를 호출할 때는 o-register 에 인자를 넘겨주어야 하는데, 이 과정을 delay slot 에서 처리할 수 있다.

유사하게 분기 명령어 실행 전에, 레지스터에 값을 할당하는 과정을 delay slot 에서 처리할 수도 있다.

 

예시를 보자.

위와 같은 간단한 코드를 작성하였다.

0 을 L1 레지스터에 담고, 다시 10을 L1 레지스터에 담고 있다.

그리고 test 로 분기를 하고 있다.

L1 의 값을 1 증가시키므로 L1 에는 결과적으로 11이 담겨 있어야 한다.

 

한번 이 코드를 어셈블하고 next_r 시점에 break 를 걸어 L1 레지스터 값을 읽어보자.

 

예상한대로 잘 나온다.

그렇다면 아까 말한대로 mov 명령어를 nop 위치로 옮겨도 같은 결과가 나올까?

위와 같은 코드를 실행시켜 본다.

같은 결과가 나옴을 알 수 있다.

이것이 분기 명령어 이전의 명령어를 nop 위치로 끌고 오는 From Before 최적화 방식이다.

 

한번 강의록에 있는 코드로 자세히 살펴보자.

간단한 반복문이다.

이를 C 코드로 옮겨보면 아래와 같은 코드이다.

int main() { int o0 = 0; int l0 = 1; while(l0


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有